%% -*- erlang -*-
%%! -sname sqlfang
%% @doc SQLFang - SQL注入检测工具
%% 作者：钟智强 @ctkqiang
%% 电邮：johnmelodymel@qq.com
%% 
%% 这是一个用 Erlang 实现的轻量级 SQL 注入检测工具
%% 主要功能：
%%   - 自动探测 SQL 注入漏洞
%%   - 支持多种注入技术（布尔盲注、时间盲注等）
%%   - 自动识别数据库类型
%%   - 高并发请求设计
%%
%% 用法示例：
%%   ./main.erl https://target.com/page.php id
%%
%% 参数说明：
%%   - 第一个参数：目标URL（需要带协议头）
%%   - 第二个参数：要测试的参数名
%%
%% 注意事项：
%%   - 使用前请确保已编译所有依赖模块
%%   - 建议在测试环境使用，勿用于未授权目标
%%   - 遵守《中华人民共和国网络安全法》

%% ============================================================================
%% == 重要声明 ==
%% ============================================================================
%% 本程序仅供学习和技术研究使用，禁止将其用于任何未获授权的侵入、
%% 攻击、监听、干扰或其他违反网络安全和隐私保护的行为。
%%
%% 使用者必须在**完全理解并同意上述条款**的前提下使用本程序。
%% 任何将本程序用于**非法目的**的行为，其**所有后果**（包括但不限于
%% 行政处罚、民事赔偿、刑事责任）**均由使用者自行承担**。
%%
%% 请务必遵守您所在国家和地区的相关法律法规，特别是以下中国法律条款：
%%
%% - 《中华人民共和国网络安全法》 第十二条：任何个人和组织不得利用网络
%%   从事危害国家安全、荣誉和利益，煽动颠覆国家政权等违法犯罪活动。
%% - 《中华人民共和国刑法》 第二百八十五条至第二百八十七条：
%%   非法侵入计算机信息系统、破坏系统功能或数据的行为将被追究刑事责任。
%% - 《中华人民共和国数据安全法》 第三条、第十七条：
%%   从事数据处理活动应当依法保障数据安全，禁止非法获取、泄露数据。
%%
%% 💡特别提醒：本程序设计中可能涉及网络通信、数据收集、远程控制等功能，
%% 均应在**授权范围内**使用，任何对设备、系统、数据的未经授权的访问或控制
%% 都属于违法行为。
%%
%% 📛 违反以上条款造成的一切法律后果与责任，与作者无关。
%%
%% ============================================================================

-module(main).
-export([main/1]).

-mode(compile).

%% main/1 - 主入口函数
%% 参数：
%%   - [Url, Param]：包含目标URL和注入参数的列表
%%   - 示例：["https://target.com/page.php", "id"]
main([Url, Param]) ->
    io:format("~n🚀 SQLFang 启动中...~n"),
    io:format("🎯 目标地址: ~s~n", [Url]),
    io:format("🔑 注入参数: ~s~n", [Param]),

    % 启动 http 和 ssl 支持，确保能发送 HTTPS 请求
    application:start(inets),
    application:start(ssl),

    % 载入模块路径（需要提前编译好 .beam 文件）
    code:add_path("ebin"),

    % 执行扫描流程：先初始化扫描器，然后开始扫描
    case scanner:start() of
        ok ->
            case scanner:scan(Url, Param) of
                {error, Reason} ->
                    io:format("❌ 扫描失败: ~p~n", [Reason]);
                _ ->
                    ok
            end;
        error ->
            io:format("❌ 扫描器初始化失败，请确保依赖模块编译完成并可访问~n")
    end;

%% 参数错误时的处理分支
%% 温馨提示用户正确的使用方式
main(_) ->
    io:format("❌ 参数不足，请提供目标 URL 和参数名，例如： ./main.erl https://site.com/page.php id~n").
